package cn.sjxy.config;

import cn.sjxy.config.mvcExtend.CheckLoginInterceptor;
import cn.sjxy.config.mvcExtend.StringToDateConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * springMVC配置
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    //将登录拦截器注入到Spring中
    @Bean
    public CheckLoginInterceptor getLoginInterceptor() {
        return new CheckLoginInterceptor();
    }

    //添加自定义拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册自定义权限拦截器，拦截所有请求
        registry.addInterceptor(getLoginInterceptor())
                .addPathPatterns("/**");  // 拦截所有路径
    }

    //跨域配置
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //允许跨域的域名，可以用*表示允许任何域名使用，也可以配置多个域名
                .allowedOrigins("*")
                //允许的Http方法（post、get等）
                .allowedMethods("POST", "GET", "OPTIONS", "PUT", "DELETE")
                //允许任何请求头
                .allowedHeaders("*")
                //允许发送身份验证信息,如Cookie
                .allowCredentials(false)
                //暴露的header信息
                .exposedHeaders("access-control-allow-headers",
                        "access-control-allow-methods",
                        "access-control-allow-origin",
                        "access-control-max-age",
                        "X-Frame-Options")
                //maxAge(3600)表明在3600秒内，不需要再发送预检验请求，可以缓存该结果
                .maxAge(3600L);
    }

    //添加资源映射,设定上传文件的位置
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //配置静态资源处理器
        registry.addResourceHandler("/**")
                //指定静态资源保存的位置
                .addResourceLocations("classpath:/META-INF/resources/")
                .addResourceLocations("classpath:/resources/");
        /*解释，将保存上传文件的路径映射为某个路径:
        /uploadDir/**    :相当于 别名的意思,在文件下载时，用/uploadDir/引用磁盘上的某个目录
        file:c:/图片/    :本地文件的路径 */
        registry.addResourceHandler("/uploadDir/**")
                .addResourceLocations(String.format("file:c:/uploadFiles/"));
    }

    //添加自定义格式化和转换
    @Override
    public void addFormatters(FormatterRegistry registry) {
        //添加自定义转换，并设定日期的格式
        StringToDateConverter converter = new StringToDateConverter();
        converter.setDatePattern("yyyy-MM-dd");
        registry.addConverter(converter);
    }

}

